Hogy lehet, hogy bizonyos véletlenszerű karakterláncok színeket eredményeznek, ha háttérszínként adják meg őket a HTML-ben? Például: teszt ... minden böngészőben és platformon piros háttérrel rendelkező dokumentumot készít. Érdekes, hogy míg a chucknorri szintén piros hátteret eredményez, addig a chucknorr sárga hátteret eredményez. Mi folyik itt?
2020-12-07 21:55:55
Ez visszatartó a Netscape napokból: A hiányzó számokat 0 [...] -ként kezeljük. A helytelen számjegyet egyszerűen 0-ként értelmezik. Például a # F0F0F0, F0F0F0, F0F0F, #FxFxFx és FxFxFx értékek egyformák. A blogbejegyzésből származik egy kis rémület a Microsoft Internet Explorer színelemzéséről, amely nagyon részletesen lefedi, beleértve a változó hosszúságú színértékeket stb. Ha a szabályokat sorra alkalmazzuk a blogbejegyzésből, a következőket kapjuk: Cseréljen le minden érvénytelen hexadecimális karaktert 0-ra: chucknorris lesz c00c0000000 Töltse ki a következő 3-mal (11 → 12) osztható karakterek számát: c00c 0000 0000 Három egyenlő csoportra osztva, mindegyik komponens az RGB szín megfelelő színkomponensét képviseli: RGB (c00c, 0000, 0000) Csonkolja le az argumentumokat jobbról lefelé két karakterre. Ami végül a következő eredményt adja: RGB (c0, 00, 00) = # C00000 vagy RGB (192, 0, 0) Íme egy példa, amely bemutatja a bgcolor attribútum működését ennek a „csodálatos” színmintának az elkészítéséhez:chuck norris Mr T ninjaturtle Ez válaszolja meg a kérdés másik részét is: Miért eredményez bgcolor = "chucknorr" sárga színt? Nos, ha alkalmazzuk a szabályokat, akkor a karakterlánc a következő: c00c00000 => c00 c00 000 => c0 c0 00 [RGB (192, 192, 0)] Ami világossárga arany színt ad. Mivel a karakterlánc 9 karakterből indul, ezúttal megtartjuk a második „C” -et, ezért a végső színértékbe kerül. Eredetileg akkor találkoztam ezzel, amikor valaki rámutatott, hogy szín = "szar" lehet, és nos, barna színű. | Sajnálom, hogy nem értek egyet, de a @Yuhong Bao által közzétett örökségi színérték elemzésének szabályai szerint a chucknorris NEM egyenlő a # CC0000-val, sokkal inkább a # C00000-vel, ami egy nagyon hasonló, de kissé eltérő vörös színárnyalat. Ennek ellenőrzéséhez a Firefox ColorZilla kiegészítőt használtam. A szabályok kimondják: tegye a karakterláncot 3-szoros hosszúságúvá 0-k hozzáadásával: chucknorris0 különítse el a húrokat 3 egyenlő hosszú húrra: chuc knor ris0 csonkoljon minden karakterláncot 2 karakterre: ch kn ri tartsa meg a hexa értékeket, és szükség esetén adjon hozzá 0-kat: C0 00 00 Ezekkel a szabályokkal helyesen értelmeztem a következő karakterláncokat: LuckyCharms Szerencse LuckBeALady LuckBeALadyTonight Gangnam stílus FRISSÍTÉS: Az eredeti válaszolók, akik szerint a szín # CC0000, azóta szerkesztették válaszaikat, hogy tartalmazzák a javítást. | A legtöbb böngésző egyszerűen figyelmen kívül hagyja a színes karaktersorozat NON-hex értékeit, a nem hexa számjegyeket nullákkal helyettesítve. ChuCknorris fordítása c00c0000000. Ekkor a böngésző három egyenlő részre osztja a karakterláncot, megjelölve a piros, a zöld és a kék értékeket: c00c 0000 0000. Az egyes szakaszokban lévő extra biteket figyelmen kívül hagyják, ami a # c00000 végeredményt jelenti, amely vöröses színű. Megjegyzés: ez nem vonatkozik a CSS színelemzésre, amelyek megfelelnek a CSS szabványnak. beteg barom fű Pirosít
Ugyanaz, mint fent
Fekete
| Ennek oka, hogy a böngésző nem tudja megérteni, és megpróbálja valahogy lefordítani arra, amit megért, és ebben az esetben hexadecimális értékre! A chucknorris c-vel kezdődik, amely hexadecimális karakterként van felismerve, és az összes fel nem ismert karaktert 0-ra konvertálja! Tehát a chucknorris hexadecimális formátumban a következő lesz: c00c00000000, az összes többi karakter 0-ra változik, és c ott marad, ahol vannak ... Most 3-mal osztják RGB-re (piros, zöld, kék) ... R: c00c, G: 0000, B: 0000 ... De tudjuk, hogy az RGB érvényes hexadecimális értéke csak 2 karakter, vagyis R: c0, G: 00, B: 00 Tehát a valódi eredmény: bgcolor = "# c00000"; Gyors referenciaként a kép lépéseit is hozzáadtam: | A böngésző megpróbálja a chucknorrist hexadecimális színkódra konvertálni, mert ez nem érvényes érték. A chucknorris-ban a c kivételével minden nem érvényes hexaérték. Tehát konvertálódik c00c00000000-ra. Amely # c00000 lesz, a vörös árnyalata. Úgy tűnik, hogy ez elsősorban az Internet Explorer és az Opera (12) problémája, mivel a Chrome (31) és a Firefox (26) ezt csak figyelmen kívül hagyja. P.S. A zárójelben szereplő számok azok a böngészőverziók, amelyeket teszteltem. Könnyebb hangon Chuck Norris nem felel meg a webes szabványoknak. A webes szabványok megfelelnek neki. # BADA55 | A WHATWG HTML specifikáció pontosan megadja a régi szín elemzésének algoritmusátérték: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value. A színhúrok elemzéséhez használt Netscape Classic kód nyílt forráskódú: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155. Például vegye figyelembe, hogy mindegyik karaktert hexadecimális formátumban elemzik, majd 32 bites egész számra helyezik át a túlcsordulás ellenőrzése nélkül. Csak 32 hexabetű illik egy 32 bites egész számba, ezért csak az utolsó 8 karaktert vesszük figyelembe. Miután a hexadecimális elemeket 32 bites egész számokká elemezte, azokat 8 bites egész számokká csonkolja úgy, hogy elosztja őket 16-mal, amíg el nem illeszkedik a 8-bitesbe, ezért a vezető nullákat figyelmen kívül hagyják. Frissítés: Ez a kód nem pontosan egyezik a specifikációban megadottal, de az egyetlen különbség néhány kódsorban van. Azt hiszem, ezeket a sorokat adták hozzá (a Netscape 4-ben): if (bytes_per_val> 4) { bytes_per_val = 4; } | Válasz: A böngésző megpróbálja konvertálni a chucknorrist hexadecimális értékre. Mivel a c az egyetlen érvényes hexadecimális karakter a chucknorrisban, az érték a következőre változik: c00c00000000 (0 az összes érvénytelen értékre). Ezután a böngésző 3 csoportra osztja az eredményt: Piros = c00c, Zöld = 0000, Kék = 0000. Mivel a html hátterek érvényes hexaértékei csak 2 számjegyet tartalmaznak minden színtípushoz (r, g, b), az utolsó 2 számjegyet minden csoportból levágják, így az rgb értéke c00000, amely tégla-vöröses tónusú szín. | A chucknorris c-vel kezdődik, és a böngésző beolvassa hexadecimális értékre. Mivel A, B, C, D, E és F hexadecimális karakterek. A böngésző a chucknorrisokat hexadecimális értékre, C00C00000000 alakítja. Ezután a C00C00000000 hexadecimális értéket RGB formátumra konvertáljuk (elosztva 3-mal): C00C00000000 ⇒ R: C00C, G: 0000, B: 0000 A böngészőnek csak két számjegyre van szüksége a szín jelzéséhez: R: C00C, G: 0000, B: 0000 ⇒ R: C0, G: 00, B: 00 ⇒ C00000 Végül mutassa meg a bgcolor = C00000 elemet a webböngészőben. Íme egy példa, amely bemutatja:| Az örökölt attribútumok színeinek elemzésére vonatkozó szabályok további lépéseket tartalmaznak, mint amelyeket a meglévő válaszok említenek. A 2 számjegyből álló csonkakomponens leírása a következő: Dobja el az összes karaktert, kivéve az utolsó 8-at Dobja el a nullákat egyenként, amíg az összes komponensnek nullája van Dobja el az összes karaktert az első 2 kivételével Néhány példa: oooFoooFoooF 000F 000F 000F <- cserélje ki, betét és darab 0F 0F 0F <- az első nullák csonkítva 0F 0F 0F <- jobbra 2 karakterre csonkítva oooFooFFoFFF 000F 00FF 0FFF <- cserélje ki, betét és darab 00F 0FF FFF <- az első nullák csonkítva 00 0F FF <- jobbra 2 karakterre csonkítva ABCooooooABCooooooABCoooooo ABC000000 ABC000000 ABC000000 <- cserélje ki, betétet és darabot BC000000 BC000000 BC000000 <- balról 8 karakterre csonkítva BC BC BC <- jobbra 2 karakterre csonkítva AoCooooooAoCooooooAoCoooooo A0C000000 A0C000000 A0C000000 <- cserélje ki, betétet és darabot 0C000000 0C000000 0C000000 <- balról 8 karakterre csonkítva C000000 C000000 C000000 <- az első nullák csonkítva C0 C0 C0 <- jobbra 2 karakterre csonkítva Az alábbiakban az algoritmus részleges megvalósítását mutatjuk be. Nem kezeli azokat a hibákat vagy eseteket, amikor a felhasználó érvényes színt ad meg. függvény parseColor (input) { // todo: visszatérési hiba, ha a bemenet "" input = input.trim (); // todo: visszatérési hiba, ha a bemenet "átlátszó" // todo: adja vissza a megfelelő #rrggbb szót, ha a bemenet megnevezett színű // todo: return #rrggbb, ha az input megfelel az #rgb-nek // todo: az U + FFFF-nél nagyobb unicode kódpontokat cserélje le 00-ra if (bemenet.hossz> 128) { bemenet = bemenet.szelet (0, 128); } if (input.charAt (0) === "#") { bemenet = bemenet.szelet (1); } input = input.replace (/ [^ 0-9A-Fa-f] / g, "0"); while (input.length === 0 || input.length% 3> 0) { bemenet + = "0"; } var r = input.slice (0, input.length / 3); var g = input.slice (input.length / 3, input.length * 2/3); var b = bemenet.szelet (bemenet.hossz * 2/3); if (r.hossz> 8) { r = r.szelet (-8); g = g. szelet (-8); b = b.szelet (-8); } while (r.hossz> 2 && r.charAt (0) === "0" && g.charAt (0) === "0" && b.charAt (0) === "0") { r = r.szelet (1); g = g. szelet (1); b = b. szelet (1); } if (r.hossz> 2) { r = r.szelet (0, 2); g = g. szelet (0, 2); b = b. szelet (0, 2); } return "#" + r.padStart (2, "0") + g.padStart (2, "0") + b.padStart (2, "0"); } $ (function () { $ ("# input"). on ("változás", function () { var input = $ (this) .val (); var color = parseColor (input); var $ cell = $ ("# result tbody td"); $ cell.eq (0) .attr ("bgcolor", input); $ cellák eq (1) .attr ("bgcolor", szín); varérték: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value. A színhúrok elemzéséhez használt Netscape Classic kód nyílt forráskódú: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155. Például vegye figyelembe, hogy mindegyik karaktert hexadecimális formátumban elemzik, majd 32 bites egész számra helyezik át a túlcsordulás ellenőrzése nélkül. Csak 32 hexabetű illik egy 32 bites egész számba, ezért csak az utolsó 8 karaktert vesszük figyelembe. Miután a hexadecimális elemeket 32 bites egész számokká elemezte, azokat 8 bites egész számokká csonkolja úgy, hogy elosztja őket 16-mal, amíg el nem illeszkedik a 8-bitesbe, ezért a vezető nullákat figyelmen kívül hagyják. Frissítés: Ez a kód nem pontosan egyezik a specifikációban megadottal, de az egyetlen különbség néhány kódsorban van. Azt hiszem, ezeket a sorokat adták hozzá (a Netscape 4-ben): if (bytes_per_val> 4) { bytes_per_val = 4; } | Válasz: A böngésző megpróbálja konvertálni a chucknorrist hexadecimális értékre. Mivel a c az egyetlen érvényes hexadecimális karakter a chucknorrisban, az érték a következőre változik: c00c00000000 (0 az összes érvénytelen értékre). Ezután a böngésző 3 csoportra osztja az eredményt: Piros = c00c, Zöld = 0000, Kék = 0000. Mivel a html hátterek érvényes hexaértékei csak 2 számjegyet tartalmaznak minden színtípushoz (r, g, b), az utolsó 2 számjegyet minden csoportból levágják, így az rgb értéke c00000, amely tégla-vöröses tónusú szín. | A chucknorris c-vel kezdődik, és a böngésző beolvassa hexadecimális értékre. Mivel A, B, C, D, E és F hexadecimális karakterek. A böngésző a chucknorrisokat hexadecimális értékre, C00C00000000 alakítja. Ezután a C00C00000000 hexadecimális értéket RGB formátumra konvertáljuk (elosztva 3-mal): C00C00000000 ⇒ R: C00C, G: 0000, B: 0000 A böngészőnek csak két számjegyre van szüksége a szín jelzéséhez: R: C00C, G: 0000, B: 0000 ⇒ R: C0, G: 00, B: 00 ⇒ C00000 Végül mutassa meg a bgcolor = C00000 elemet a webböngészőben. Íme egy példa, amely bemutatja: chucknorris c00c00000000 c00000 | Az örökölt attribútumok színeinek elemzésére vonatkozó szabályok további lépéseket tartalmaznak, mint amelyeket a meglévő válaszok említenek. A 2 számjegyből álló csonkakomponens leírása a következő: Dobja el az összes karaktert, kivéve az utolsó 8-at Dobja el a nullákat egyenként, amíg az összes komponensnek nullája van Dobja el az összes karaktert az első 2 kivételével Néhány példa: oooFoooFoooF 000F 000F 000F <- cserélje ki, betét és darab 0F 0F 0F <- az első nullák csonkítva 0F 0F 0F <- jobbra 2 karakterre csonkítva oooFooFFoFFF 000F 00FF 0FFF <- cserélje ki, betét és darab 00F 0FF FFF <- az első nullák csonkítva 00 0F FF <- jobbra 2 karakterre csonkítva ABCooooooABCooooooABCoooooo ABC000000 ABC000000 ABC000000 <- cserélje ki, betétet és darabot BC000000 BC000000 BC000000 <- balról 8 karakterre csonkítva BC BC BC <- jobbra 2 karakterre csonkítva AoCooooooAoCooooooAoCoooooo A0C000000 A0C000000 A0C000000 <- cserélje ki, betétet és darabot 0C000000 0C000000 0C000000 <- balról 8 karakterre csonkítva C000000 C000000 C000000 <- az első nullák csonkítva C0 C0 C0 <- jobbra 2 karakterre csonkítva Az alábbiakban az algoritmus részleges megvalósítását mutatjuk be. Nem kezeli azokat a hibákat vagy eseteket, amikor a felhasználó érvényes színt ad meg. függvény parseColor (input) { // todo: visszatérési hiba, ha a bemenet "" input = input.trim (); // todo: visszatérési hiba, ha a bemenet "átlátszó" // todo: adja vissza a megfelelő #rrggbb szót, ha a bemenet megnevezett színű // todo: return #rrggbb, ha az input megfelel az #rgb-nek // todo: az U + FFFF-nél nagyobb unicode kódpontokat cserélje le 00-ra if (bemenet.hossz> 128) { bemenet = bemenet.szelet (0, 128); } if (input.charAt (0) === "#") { bemenet = bemenet.szelet (1); } input = input.replace (/ [^ 0-9A-Fa-f] / g, "0"); while (input.length === 0 || input.length% 3> 0) { bemenet + = "0"; } var r = input.slice (0, input.length / 3); var g = input.slice (input.length / 3, input.length * 2/3); var b = bemenet.szelet (bemenet.hossz * 2/3); if (r.hossz> 8) { r = r.szelet (-8); g = g. szelet (-8); b = b.szelet (-8); } while (r.hossz> 2 && r.charAt (0) === "0" && g.charAt (0) === "0" && b.charAt (0) === "0") { r = r.szelet (1); g = g. szelet (1); b = b. szelet (1); } if (r.hossz> 2) { r = r.szelet (0, 2); g = g. szelet (0, 2); b = b. szelet (0, 2); } return "#" + r.padStart (2, "0") + g.padStart (2, "0") + b.padStart (2, "0"); } $ (function () { $ ("# input"). on ("változás", function () { var input = $ (this) .val (); var color = parseColor (input); var $ cell = $ ("# result tbody td"); $ cell.eq (0) .attr ("bgcolor", input); $ cellák eq (1) .attr ("bgcolor", szín); var chucknorris c00c00000000 c00000